//*************** 等同于es5 *****************/

class Point {
    constructor() {
      // ...
    }
  
    toString() {
      // ...
    }
  
    toValue() {
      // ...
    }
  }
  
  // 等同于
  
  Point.prototype = {
    constructor() {},
    toString() {},
    toValue() {},
  };



//*************** Object.is()  *****************/

class B {}
const b = new B();
b.constructor === B.prototype.constructor // true


//*************** 静态方法  *****************/

class Foo {
    static classMethod() {
      return 'hello';
    }
}
  
  Foo.classMethod() // 'hello'
  
  var foo = new Foo();
  foo.classMethod()
  // TypeError: foo.classMethod is not a function


//*************** 私有方法和私有属性  *****************/

class Widget {
    foo (baz) {
        bar.call(this, baz);
    }
}

function bar(baz) {
    return this.snaf = baz;
}


//*************** 私有方法和私有属性  利用Symbol值的唯一性*****************/

const bar = Symbol('bar');
const snaf = Symbol('snaf');

export default class myClass{

  // 公有方法
  foo(baz) {
    this[bar](baz);
  }

  // 私有方法
  [bar](baz) {
    return this[snaf] = baz;
  }

};


//*************** 利用这个特点，可以写出不能独立使用、必须继承后才能使用的类。****************/

class Shape {
  constructor() {
    if (new.target === Shape) {
      throw new Error('本类不能实例化');
    }
  }
}

class Rectangle extends Shape {
  constructor(length, width) {
    super();
    // ...
  }
}

var x = new Shape();  // 报错
var y = new Rectangle(3, 4);  // 正确